extends Node2D
@onready var 相机 = %相机
@onready var man = %Man
@onready var tile_map = $TileMap
@onready var bgm播放器 = $"bgm播放器"

var 场景id:String

func _ready():
	pass
	
func 退出():
	pass
	
func 初始化(关卡id:String):
	场景id=关卡id
	相机.position=获取地图中心坐标()	
	bgm播放器.stream=load("res://素材/OST 3 - Synth Fanfare (Loopable).mp3")
	bgm播放器.play()
	
func 获取地图中心坐标():
	var 起点=tile_map.get_used_rect().position
	var 大小=tile_map.get_used_rect().size
	return 获取位置(起点)+获取位置(大小)/2
	
func 获取位置(pos:Vector2i):
	return tile_map.position+tile_map.map_to_local(pos)-Vector2(tile_map.tile_set.tile_size/2)
	
func _input(event):
	var cell:Vector2i=tile_map.local_to_map(man.position)	
	var cell1:Vector2i
	var cell2:Vector2i
	var dir1:Vector2i
	var dir2:Vector2i
	if event.is_action_pressed("ui_down"):
		dir1=Vector2i(0,1)
		dir2=Vector2i(0,2)
	elif event.is_action_pressed("ui_up"):
		dir1=Vector2i(0,-1)
		dir2=Vector2i(0,-2)
	elif event.is_action_pressed("ui_right"):
		dir1=Vector2i(1,0)
		dir2=Vector2i(2,0)
	elif event.is_action_pressed("ui_left"):
		dir1=Vector2i(-1,0)
		dir2=Vector2i(-2,0)
	elif event.is_action_pressed("重新开始"):
		GameViewManager.重新加载当前场景()
		
	cell1=cell+dir1
	cell2=cell+dir2
	if not 是障碍物(cell1):
		玩家移动到(cell1)
	else:
		if 是箱子(cell1) and not 是障碍物(cell2):
			箱子移动到(cell1,cell2)
			玩家移动到(cell1)

	
func 是障碍物(cell:Vector2i):
	if 是箱子(cell) or 是墙壁(cell):
		return true
	return false

func 是箱子(cell:Vector2i):
	var cell集=tile_map.get_used_cells(3)	
	if cell集.has(cell):
		return true
	return false
	
func 是墙壁(cell:Vector2i):
	var cell集=tile_map.get_used_cells(2)	
	if cell集.has(cell):
		return true
	return false
	
func 是目的地(cell:Vector2i):
	var cell集=tile_map.get_used_cells(1)	
	if cell集.has(cell):
		return true
	return false
	
func 玩家移动到(cell:Vector2i):
	var pos=tile_map.map_to_local(cell)
	man.position=pos
	刷新man()	

func 箱子移动到(cell1:Vector2i, cell2:Vector2i):
	设置为地面(cell1)
	设置为箱子(cell2)
	if 胜利():
		var 下一关id=场景id.left(2)+str(int(场景id.right(-2))+1)
		if not GameViewRegister.获取场景(下一关id):
			print("游戏通关")
		else:
			GameViewManager.打开弹窗("胜利",{下一关=下一关id})

func 设置为箱子(cell:Vector2i):
	tile_map.set_cell(3,cell,10,Vector2i(0,0))
	
func 设置为地面(cell:Vector2i):
	tile_map.erase_cell(3,cell)

func 刷新man():
	var cell=tile_map.local_to_map(man.position)
	if 是目的地(cell):
		man.texture=preload("res://素材/man_des.bmp")
	else:
		man.texture=preload("res://素材/man.bmp")

func 胜利():
	var 箱子集=tile_map.get_used_cells(3)
	var 目的地集=tile_map.get_used_cells(1)
	for cell in 箱子集:
		if not 目的地集.has(cell):
			return false
			
	return true
